package ace.cmp.data.spring.data.jdbc.querydsl.rsql.core.model;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.apache.commons.collections.CollectionUtils;

/**
 * .
 * @author Caspar
 *
 */
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class SaveListContext<T> {

  private List<SaveContext<T>> data;

  /**
   * 获取新增数据.
   * @return 新增的数据
   */
  public List<SaveContext<T>> getNewData() {
    if (CollectionUtils.isEmpty(data)) {
      return new ArrayList<>();
    }
    return data.stream()
        .filter(SaveContext::isNew)
        .collect(Collectors.toList());
  }

  /**
   * 获取修改数据.
   * @return 修改的数据
   */
  public List<SaveContext<T>> getModifyData() {
    if (CollectionUtils.isEmpty(data)) {
      return new ArrayList<>();
    }
    return data.stream()
        .filter(SaveContext::isModify)
        .collect(Collectors.toList());
  }


  /**
   * 获取删除数据.
   * @return 删除的数据
   */
  public List<SaveContext<T>> getRemoveData() {
    if (CollectionUtils.isEmpty(data)) {
      return new ArrayList<>();
    }
    return data.stream()
        .filter(SaveContext::isRemove)
        .collect(Collectors.toList());
  }


  /**
   * 获取新增或修改数据.
   *
   * @return 新增或修改数据
   */
  public List<SaveContext<T>> getNewOrModifyData() {
    if (CollectionUtils.isEmpty(data)) {
      return new ArrayList<>();
    }
    return data.stream()
        .filter(p -> p.isNew() || p.isModify())
        .collect(Collectors.toList());
  }

  /**
   * 获取新增或修改原始数据.
   *
   * @return 新增或修改原始数据
   */
  public List<T> getNewOrModifyOriginData() {
    if (CollectionUtils.isEmpty(data)) {
      return new ArrayList<>();
    }
    return data.stream()
        .filter(p -> p.isNew() || p.isModify())
        .map(SaveContext::getData)
        .collect(Collectors.toList());
  }

  /**
   * 获取新增原始数据.
   *
   * @return 新增原始数据
   */
  public List<T> getNewOriginData() {
    if (CollectionUtils.isEmpty(data)) {
      return new ArrayList<>();
    }
    return data.stream()
        .filter(SaveContext::isNew)
        .map(SaveContext::getData)
        .collect(Collectors.toList());
  }

  /**
   * 获取修改原始数据.
   *
   * @return 修改原始数据
   */
  public List<T> getModifyOriginData() {
    if (CollectionUtils.isEmpty(data)) {
      return new ArrayList<>();
    }
    return data.stream()
        .filter(SaveContext::isModify)
        .map(SaveContext::getData)
        .collect(Collectors.toList());
  }

  /**
   * 获取原始数据.
   *
   * @return 原始数据
   */
  public List<T> getOriginData() {
    return Stream.ofNullable(this.data)
        .flatMap(List::stream)
        .map(SaveContext::getData)
        .collect(Collectors.toList());
  }


}
